import axios, { type AxiosRequestConfig } from "axios";
// import type { MyResponseType } from "../types";
import { store } from "../../store";
import { Toast } from "antd-mobile";

/**
 * 创建axios实例
 * baseURL: API基础路径，所有请求都会加上这个前缀
 * timeout: 请求超时时间，2秒后自动取消请求
 */
const service = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 1000 * 10 // 增加超时时间到10秒
});

/**
 * 请求拦截器
 * 在发送请求前统一处理，如添加认证信息、显示加载提示等
 */
service.interceptors.request.use(function (config) {

  const state = store.getState();

  // 显示加载提示
  Toast.show({
    icon: 'loading',
    content: '加载中…',
  })

  // 从Redux store获取用户认证信息
  const sessionId = (state?.user?.userInfo as any)?.sessionId;
  const userId = (state?.user?.userInfo as any)?.userId;

  // 自动添加sessionId到请求头
  if (sessionId) {
    config.headers.sessionId = sessionId;
  }

  // 自动添加userId到请求头（排除无效值-1）
  if (userId && userId !== -1) {
    config.headers.userId = userId;
  }

  return config;
}, function (error) {
  // 请求错误时清除加载提示
  Toast.clear()
  return Promise.reject(error);
});

/**
 * 响应拦截器
 * 统一处理响应数据，包括业务状态码判断和错误处理
 */
service.interceptors.response.use(function (response) {
  // 清除加载提示
  Toast.clear();

  const { status } = response.data;

  // 根据业务状态码进行不同处理
  switch (status) {
    case '9999': break; // 成功状态，无需特殊处理
    case '9001': console.log('服务端错误'); break; // 服务端错误
    case '8001':
      console.log('用户业务错误');
      break;
    case '8002': console.log('医生业务错误'); break; // 医生相关业务错误
    case '8003': console.log('公共业务错误'); break; // 公共业务错误
  }

  return response;
}, function (error) {
  // 响应错误时清除加载提示
  Toast.clear()

  // 处理HTTP状态码错误
  if (error && error.response) {
    console.log('error data:', error.response?.data)

    switch (error.response.status) {
      case 400: console.log('请求错误'); break; // 客户端请求错误
      case 401: console.log('访问未授权'); break; // 未授权访问
      case 404: console.log('资源未找到'); break; // 资源不存在
      default: console.log('其他错误信息'); // 其他HTTP错误
    }
  }

  return Promise.reject(error);
});

/**
 * 统一请求函数
 * 封装axios请求，自动处理响应数据格式
 * @param config axios请求配置
 * @returns Promise<MyResponseType<T>> 返回统一格式的响应数据
 */
const request = async (config: AxiosRequestConfig): Promise<any> => {
  const res = await service.request<any>(config);
  return res.data; // 直接返回响应数据，不需要再取.data
}

export default request;